#include <stdio.h>

// 将x从第p位开始的n位设置为y最右面的n位
int setbits(int x, int p, int n, int y);

int setbitsTest() {

    int x = 5858558;
    int y = 63256;
    int p = 15;
    int n = 7;
    int d = setbits(x, p, n, y);
    printf("x = %d, y = %d, p = %d, n = %d , result %d \n", x, y, p, n, d);
    return 0;
}

/**
 * 假如x = 00000000011011111, p = 7, n = 3, y = 0000000110000010
 * 期望x = 00000000010101111 
 *
 * 1. 将 y 除了最右3位其他全变为0 ，
 * 2. 然后向左移 7-3 位
 * 3. 构造一个 从p开始的n位 都为0，其他都为1的数
 * 4. 与x 做 & 运算，将 x 的从p 到n 的值都变为 0 ，其他不变
 * 5. 或一下
 */
int setbits(int x, int p, int n, int y) {
    /* 注意 不要将位运算的中间值用printf方法打印，因为这中间会存在将数据转为原码的过程，如果是负数那么会让你迷惑 */
    // 1.
    int y2 = ((~0 << n) | y) & (~((~0 << n)));
    // printf("%d\n",y2);

    // 2.
    int y3 = y2 << (p - n);
    // printf("%d\n",y3);

    // 3.
    int x1 = ~((~(~0 << n)) << (p - n));
    // printf("%d\n",x1);

    // 4.
    int x2 = x1 & x;
    // printf("%d\n",x2);

    // 5.
    return x2 | y3;
}
